package com.wl.shixun3.util;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 会话管理器 - 实现单点登录
 * 确保一个账号只能在一个地方登录
 */
public class SessionManager {
    // 存储用户名和对应的session ID的映射
    // key: username, value: sessionId
    private static final Map<String, String> userSessionMap = new ConcurrentHashMap<>();
    
    // 存储session ID和HttpSession的映射
    // key: sessionId, value: HttpSession
    private static final Map<String, HttpSession> sessionMap = new ConcurrentHashMap<>();
    
    /**
     * 检查用户是否已经登录
     * @param username 用户名
     * @return 如果用户已登录返回true，否则返回false
     */
    public static boolean isUserLoggedIn(String username) {
        String sessionId = userSessionMap.get(username);
        if (sessionId == null) {
            return false;
        }
        
        // 检查会话是否仍然有效
        HttpSession session = sessionMap.get(sessionId);
        if (session == null) {
            // 会话不存在，清理映射
            userSessionMap.remove(username);
            return false;
        }
        
        try {
            // 尝试访问会话，如果会话已失效会抛出异常
            session.getAttribute("user");
            return true;
        } catch (IllegalStateException e) {
            // 会话已失效，清理映射
            userSessionMap.remove(username);
            sessionMap.remove(sessionId);
            return false;
        }
    }
    
    /**
     * 添加或更新用户会话
     * @param username 用户名
     * @param session 新的会话对象
     */
    public static void addSession(String username, HttpSession session) {
        // 添加新会话（不再踢出旧会话，因为在登录前已经检查过）
        String newSessionId = session.getId();
        userSessionMap.put(username, newSessionId);
        sessionMap.put(newSessionId, session);
    }
    
    /**
     * 移除用户会话
     * @param username 用户名
     */
    public static void removeSession(String username) {
        String sessionId = userSessionMap.remove(username);
        if (sessionId != null) {
            sessionMap.remove(sessionId);
        }
    }
    
    /**
     * 根据session ID移除会话
     * @param sessionId 会话ID
     */
    public static void removeSessionById(String sessionId) {
        HttpSession session = sessionMap.remove(sessionId);
        if (session != null) {
            // 从userSessionMap中移除
            String username = (String) session.getAttribute("username");
            if (username != null) {
                userSessionMap.remove(username);
            }
        }
    }
    
    /**
     * 检查用户是否已经在其他地方登录
     * @param username 用户名
     * @param currentSessionId 当前会话ID
     * @return 如果已在其他地方登录返回true
     */
    public static boolean isLoggedInElsewhere(String username, String currentSessionId) {
        String existingSessionId = userSessionMap.get(username);
        return existingSessionId != null && !existingSessionId.equals(currentSessionId);
    }
    
    /**
     * 获取用户的会话
     * @param username 用户名
     * @return HttpSession对象，如果不存在返回null
     */
    public static HttpSession getSession(String username) {
        String sessionId = userSessionMap.get(username);
        if (sessionId != null) {
            return sessionMap.get(sessionId);
        }
        return null;
    }
}

